def function(*num1, num2=0):
    # 此处设置的是默认值，当num2无参数时，默认为0
    # 参数前面加*号代表不知道参数的个数，为收集参数（*将传递的参数放入元组中,**放入字典中）
    # 收集参数使用关键词参数需要写成元组形式
    for i in num1:
        i += 1
    return num1


temp1 = (1, 2)
# print(function(*temp1))
# 使用*和**号进行解包
# 此处1和2为位置参数
# print(function(1, 2, num2=1))

# 此处使用了关键词参数，位置参数和关键词参数同时存在时，位置参数要在前面
# help(sum)
'''
使用help函数查看文档时会发现参数列表内有/
/代表的意思是其左边的参数必须是位置参数而不能是关键词参数
与之对应*表示其右边的参数必须是关键词参数
'''
count = 100


def is_Bigger(num):
    global count
    if num > count:
        count += num
        return 1
    else:
        return 0


# 如上，在函数中对全局变量进行修改与使用时，需要使用global语句

'''
def func():
    x = 880

    def funa():
        nonlocal x
        x = 10
        print(x)

    # funa()
    # print(x)
    return funa


func()
# 要在内部函数修改外部函数作用域里的变量，使用nonlocal语句
# 作用范围采用L（local，局部作用域）E（enclosed嵌套函数外层）G（global全局作用域）B（build-in内置函数名），LEGB方法

# 如何不通过func调用funa

func()()
temp2 = func()
print(temp2)
temp2()
'''

# 闭包的实际用法，保护当前参数，如在游戏移动逻辑中
'''
def move():
    x = 0
    y = 0

    def temp(x1, y1):
        nonlocal x, y
        if (x + x1) <= 100 and (y + y1 <= 100):
            x += x1
            y += y1
            print(f"当前的位置是 x = {x} , y = {y}")

    return temp


char_Move = move()
char_Move(1, 2)
char_Move(1, 5)
'''


# 看到这里我们就想了，有没有办法不这么麻烦也可以通过一个函数（在不显示另一个函数的情况下）调用另一个函数呢？
def move_Temp(x1, y1):
    def move(fun):
        x = 0
        y = 0

        def temp():
            nonlocal x, y
            if (x + x1) <= 100 and (y + y1 <= 100):
                x += x1
                y += y1
                print(f"当前的位置是 x = {x} , y = {y}")

        return temp
    return move


@move_Temp(1, 3)
def key_Move():
    print("开始移动")


key_Move()
'''
原理是
key_Move = move(key_Move)
key_Move()
同时调用多个装饰器从下往上执行
'''
